ディスクモニタDREAM ――――――――――――――――――――――――――――――――――――――― Oh!mz 1986年10月号掲載 S−OS SWORD マシン語 DREAM.SOS       03000H−03FFBH S:03000H ソース  DREAM.ASC 起動方法 DREAM.SOSをロード J3000 ――――――――――――――――――――――――――――――――――――――― 読者投稿によるディスクユーティリティです。 データサーチ、ディレクトリのガーベジコレクション/並べ替えなど、 6月号で発表した「ディスクダンプ&エディタ」とは またひと味違ったものになっています。 ヘルプメニューも付いて便利に活用できるでしょう。 ・――――――― |■                | |   頑張れ3インチユーザー   | |                ■|          ――――――――・ S−OSのアプリケーション、 ユーティリティが充実するにつれて、 使用頻度もますます増してきました。 そうなるとS−OS上で手経に使える ディスクモニタが欲しくなってきます。 始めはBASICで自作したのを使っていましたが、 S−OSから起動するのが煩わしく速度も遅いので、 次にディスクI/Oは“SWORD”に任せ、 エディットはHuMonitorでする方法を試みたのです。 処理迷度は速くなりましたが モニタのダンプリストでは ディスクの論理アドレスが表示できないなどの不満が残りました。 そうこうするうちに、S−OSで動く 使いやすいディスクモニタが どうしても欲しくなるできごとがと生じます。 BOOTした時点で好みの状態にあるように “SOWRD”を改造し、ディスクに再登録するため FORMAT&SYSGEN を実行してしまったのです。 そして#D[CR]とすると……、 見るも無惨! 蓄積してきた大切なファイル類はみごとに消滅していました。 ディスクモニタを使って直接ディスクに書き込めば こんなことにならなかったのに、 と後悔しでもあとの祭り。 しかも今やディスクの入手もままならぬ 3インチユーザー(X1D)とあっては バックアップをとる余裕もなく、 限られたディスクを有効に利用するためにも 便利なディスクモニタが必要だと痛感しました。 そこでS−OSのサブルーチンを使った ディスクモニタを作ろうと一念発起し、 ちまたがなにやらサミットとかのお祭り騒動の連休中、 自宅にこもって作ったのが このディスクモニタ“DREAM” (Disk Read,Edit and Arrange Monitor)です。 ・――――――― |■                | |    DREAMの概要     | |                ■|           ――――――――・ レコードの読み書きだけでは面白くないので、 ディレクトリ操作など、 あれば便利と思われる機能をいくつか付加してみました。 DREAMには次のような機能があります。  1)レコード単位のディスクダンプ、エディット、転送  2)レコードの連続自動ダンプ  3)文字/コード列を検索し、    その論理アドレスを表示していくディスクサーチ機能  4)KILLされたものも含めて、    属性、HuBASICのもとでのパスワード値、    格納先頭クラスタ泣も表示する    なんでもかんでもディレクトリ表示機能  5)ディレクトリのガーベジコレクション  6)ディレクトリ並べ替え  7)メインメモリのダンプ、エディット機能  8)デバイス切り換え  9)ディレクトリ、FATポジション登録値変更  10)WIDTH変更  11)コマンドリストを表示するヘルプ機能 その他各機種のモニタも直接コールできるので、 それらの機能も組み合わせると いろいろ使い道があるのではないかと思います。 このプログラムは本体が3000Hから3FFFHまでで、 4000HからBFFFHまでがブロックデータバッファ (8クラスタ読み込み用)となっています。 したがって“SWORD”に対応する全機種で使えるはずです。 ・――――――― |■                | |   DREAMの使い方     | |                ■|           ――――――――・ まずS−OS“SWORD”を起動して 3000HからDREAMをロードします。 3000Hにジャンプするとコールドスタートし、 コマンドモードに入ってプロンプト@>が表示されます。 以下に説明する各コマンドはすべてこのモードで使用します。 なお、この中でパラメータの書式は   h  :16進数(0〜F)   n  :0〜9   Chr:文字   …… :連続して記述できること を示しており、たとえばhhというのは16進数2桁です。 基本的に数値入力は10進法を許可せず、16進に限定しました。 慣れない方には少々使いづらいかもしれませんが、 実際にクラスタ、レコード、論理アドレスは 16進で関係づけられているので慣れればそのほうが 正確で早く把握できると思います。 各コマンドについて説明しましよう。 ●L(hhh)  hhh で指定された番号のレコードを  レコードデータバッファに読み込み、ダンプリストとして出力する。  レコード番号の入力は16進3桁に限るが、  リスト時のレコード番号は16進、10進両方で表示される。  番号を省略すると直前に読んだ次のレコードを読む(初期値は 000H)。  80桁モードでは一度に 256バイト表示するが、  40桁モードではまず前半 128バイトを表示し、  その後スペースキーを押すごとに前半、後半を交互に表示する。  この場合はリターンキーでコマンドモードに戻る。 ●$(hhh)  直前に読み込んだレコードのデータをhhh で指定されたレコードに書き込む。  レコード番号を省略すると直前に読み込んだレコードに再書き込みをする。  一度もレコードを読まないで実行すると"No data to write!" が表示され、  このコマンドは受けつけない。  データがあれば書き込むか否かを確認してくるので、  書き込む場合は[Y]、コマンドモードに戻るときは[N]を押す。 ●D(hhhh)  メインメモリのhhhh番地から 256バイト(40桁モードでは 128バイト)ずつを  一定の時間間隔で連読的にダンプする。  アドレスを省略すると直面にダンプした次のアドレスからダンプを始める  (初期値は0000H)。  スペースキーを押すとダンプを停止しコマンドモードに戻る。 ●C(n)  Dコマンドによる連続ダンプのときの侍ち時間の間隔を  0〜9の10段階で設定する。  nの値が小さいほど待ち時間は短くなり、  nを省略すると自動的に5に設定される。  実行すると“Delay counter=n”と表示され  コマンドモードに戻る。 ●F(n(hh……または;Chr……))  nで指定されたブロック(第(nx8)クラスタからの8クラスタ)の中から  データ列を探し出し、  そのディスク内論理アドレスを16進5桁で表示する。  例)F0 4142[CR]またはF0 ;A ;B[CR]    Group=0:Cluster No.$00-$07    Search data=41 42/AB    $0108A $010E0 $03857 $0697F     ($0108A:010Hレコード内8AH番地)  ブロック番号を省略すると直前にサーチした次のブロックをサーチする。  サーチデータを省略すると直前に実行したときのサーチデータでサーチする。  サーチデータの入力は16進2桁または文字コードのいずれでもよく、  文字コードの場合は直前に必ずセミコロン(;)を置かなければならない。  データ間のスペースはあってもなくてもよく、  データ数は1行の範囲内ならば何文字でもかまわない。  00Hはサーチデータとして受けつけない。  したがって、サーチデータを解除するには F0 00[CR]を実行すればよい。  この場合、ディスクからの読み込みだけが行われる。  Fコマンドを実行すると8クラスタ分のレコードが  ブロックデータバッファ(4000H〜BFFFH)に格納される。  このあとアドレスを省略してDコマンドを実行すると  自動的に4000Hより1レコードずつ連続ダンプを始める。  ブロックデータバッファの範囲をダンプしている間は、  メモリの絶対アドレスとともに  そのデータに対応するレコード番号も表示される。  連読ダンプがバッファの範囲を越える際にはベルを嗚らす。 ●Q  ディレクトリテーブル上に存在するファイル名と属性、  格納先頭クラスタなどをKILLされたものも合めてすべて出力する。  有効なファイルの先頭には01から順番に16進2桁の番号を、  KILLされたものには“×××”を付けて表示するので、  ディレクトリの状態が容易に把握できる。  HuBASICで設定できるパスワードも検出し、  値が20Hならば“npw”(no password) と表示、  それ以外は“;”の後ろにその値を16進2桁で表示する。  例)Q[CR]    Files    01) ZEDA. Obj npw Bin* $06    02) ZING. Obj npw Bin* $09    03) Disk Convert. Bas ;39 Bas* $0B    xxx SYSTEM LABEL. eda npw ??? $0E ●&  KILLされたファイル名が残っているディレクトリテーブルの  ガーベジコレクションを行う。  実行すると“Dir=$010- Collection finish!”、"Write(Y/N)?”  と聞いてくる。  [Y]を押すと有効なファイル名だけで構成された  ディレクトリテーブルが書き込まれる。  [N]を押すとコマンドモードに戻る。 ●Ahh……  ディレクトリの順序を並べ替える。  まずQコマンドでディレクトリのリストを見て  先頭に付加された番号を確認し、  並べたい順に16進2桁の番号列をAコマンドの後ろに付けて入力する。  並べ替えられたファイルのリストが表示され、  書き込むか否かを聞いてくるので、  それでよければ[Y]を押すと  新しい順序のディレクトリテーブルが書き込まれる。  入力された番号のファイル名から順番に配置され、  入力しなかった番号のファイル名は後ろにずれていく。  例)実行前の並び:01 02 03 04 05 06 A 03 02 04[CR]    実行後の並び:03 02 04 01 05 06  このコマンドを実行したときにディレクトリの中に  KILLされたファイル名が残っていると  “Collect garbage!”の表示が出るので、  その場合はまず&コマンドを実行して  ガーベジコレクションをしてから  Aコマンドを再実行する必要がある。  番号データは必ず16進2桁とし、  データ間のスペースはあってもなくてもよい。  データ数は1行の範囲内なら何個でもよいが、  重複したり、ファイル数を越える数値を入力すると受けつけない。  一度に並べ替えのできる個数は最大38個で、  並べ特えるファイルがそれを越える場合は  何段階かに分けて実行するとよい。 ●Vdv  デバイスの設定値を変更する。  dvはA、B、C、Dのいずれかで、S、T、Qは無視する。 ●T  ディレクトリとFATのポジション設定値を変更する。  ディレクトリとFATの位置を順に聞いてくるので、  それぞれレコード番号を16進3桁で入力する。  入力をパスしたいときはリターンキーだけを押せばよい。  例)T[CR]    Dir=$020[CR]    Fat=$01E[CR]    Set OK!:Dir=$020 Fat=$01E ●?  現在設定されているデバイス、ディレクトリ、  FATポジションに読み込まれたレコード番号、  サーチされたブロック番号とサーチデータを表示する。  ただし、Fコマンドでサーチをしたあとで  Aコマンドや&コマンドを実行すると、  ブロックデータバッファのレコードデータは破壊され無効となるので、  ?コマンドで は表示されない。  例)?[CR]   Device=A:Dir=$010 Fat=$00E   Record No.$011=17   Group 1:Cluster No. $08-$0F   Search data=41 42/AB ●P  実行するたびにプリンタのON/OFFが切り換わる。  プリンタ出力はL、D、F、A、Q、?コマンドに対して有効である。 ●W  表示モードを切り換える。  実行するたびに40桁/80桁モードが切り換わる。 ●M  各機種のモニタにジャンプする。  X1はモニタでRコマンドを実行するとディスクモニタに復帰し、  G3000で戻るとコールドスタートする。  MZは3000Hにジャンプすればホットスタートに復帰する。 ●!  S−OSのコールドスタートにジャンプする。 ●H  ヘルプコマンド。  各コマンドの書式、レコードデータバッファ、  ブロックデータバッファのエリアなどを表示する。 ・――――――― |■                | |   エディット機能について   | |                ■|           ――――――――・ Lコマンドによるレコードダンプ、 Dコマンドによるメモリダンプのいずれも コマンドモードで カーソルを使ったスクリーンエディットが可能です。 方法はHuBASICなどのモニタで ダンプリストをエディットするときと同様で、 カーソルを移動してデータを変更後、 各ラインごとにリターンキーを押せばOKです。 データの書式は16進2桁、 文字コードいずれも受けつけますが、 文字コードの場合は直前に 必ずセミコロン(;)が置かれていなければ エラーになります。 データ間のスペースはあってもなくてもかまいません。 Dコマンドでも、レコードのデータは読めますが、 ディスクに対して書き込む場合は Lコマンドによるダンプでなければなりません。 DコマンドはFコマンドと併用して(サーチデータを省略して) レコードを連続ダンプして中をのぞくのに使用してください。 ・――――――― |■                | |  プログラムの入力について   | |                ■|           ――――――――・ 各機種のモニタまたはマシン語入力ツールで 3000Hから3FF7Hまでリスト1のとおりに入力します。 ヘルプコマンドのルーチンは機能上は重要ではないので、 削除できるように最後尾に配置しました。 不要であれば3D00Hから3FFBHまでは 入力しなくてもよいでしょう。 その場合はHコマンド処理部分の 3131Hから3137Hまでの7バイトを 00Hに置き換えてください。 メモリマップを図1に示しておきます。 入力が終わって、チェックサムを確認したら さっそく実行してみましょう。 まずKILLを繰り返したディスクのファイルリストを Qコマンドで見てください。 あちらこちら穴だらけになっていませんか。 そんなときは&コマンドでガーベジコレクションをして 再度リストをとってみてください。 きれいに整理されたでしょう。 ファイル名の順序が気にいらない? それではAコマンドを実行してみましょう。 一発ドンで望みどおりの順序に並べ替えられましたね。 ディレクトリやFATが標準位置にない。 うっかりKILLしたファイルを修復したい。 そんなときはFコマンドでキーワードをサーチし、 L、Dコマンドを駆使して解析してみてください。 これはひと筋縄ではいかない最高のアドベンチャーゲームですよ。 思いつくままに機能を追加していったので アルゴリズムに無駄が多くなりましたが、 改良するなどしてご愛用ください。 図1メモリマップ ・――――――――――――――――――――――――――――――――・ |                                | |                                | | 0000H ・―――――――・                   | |  |       |                   | |    |  モニタ  |   ・――・―――――――・2E00H  | |  |       |   |  | システムFCB 読み |    | |    |       |   |  | 込み用バッファ |    | |  | S-OS "SWORD" |   |  |--------------|2F00H  | |  |       |   |  |1レコード読み書き|    | |  |--------------|―――・  |用データバッファ |    | |  |       |      |==============|3000H  | | 3000H |―――――――|      |       |    | |    | DREAM |      | DREAM 本体 |    | |  |       |      |       |    | | 4000H |―――――――|―――・  |--------------|3D00H  | |    |ディレクトリ 読み | | |  | ヘルプメニュー  |    | |    |込み用バッファ | | ・――・―――――――・3FFFH  | | 5000H |―――――――| |                 | |    |ディレクトリ 並べ | |                 | |    |替え用バッファ | |8クラスタ読み込み用       | | 6000H |―――――――| |ブロックデータバッファ      | |  |       | |                 | |  |       | |                 | |  |       |−・                 | | C000H |―――――――|                   | |  |       |                   | |  |       |                   | |  |       |                   | |    ・―――――――・                   | |                                | |                                | ・――――――――――――――――――――――――――――――――・